home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1996 #15
/
Monster Media Number 15 (Monster Media)(July 1996).ISO
/
bbs_util
/
bsrc_260.zip
/
SRC.ZIP
/
FILE_DOS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-23
|
25KB
|
973 lines
/*--------------------------------------------------------------------------*/
/* */
/* */
/* ------------ Bit-Bucket Software, Co. */
/* \ 10001101 / Writers and Distributors of */
/* \ 011110 / Freely Available<tm> Software. */
/* \ 1011 / */
/* ------ */
/* */
/* (C) Copyright 1987-96, Bit Bucket Software Co. */
/* */
/* This module was written by Vince Perriello */
/* OS/2 code contributed by Bill Andrus */
/* DOS and OS/2 File I/O routines used by BinkleyTerm */
/* */
/* */
/* For complete details of the licensing restrictions, please refer */
/* to the License agreement, which is published in its entirety in */
/* the MAKEFILE and BT.C, and also contained in the file LICENSE.260. */
/* */
/* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */
/* BINKLEYTERM LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */
/* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */
/* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT BIT BUCKET */
/* SOFTWARE CO. AT ONE OF THE ADDRESSES LISTED BELOW. IN NO EVENT */
/* SHOULD YOU PROCEED TO USE THIS FILE WITHOUT HAVING ACCEPTED THE */
/* TERMS OF THE BINKLEYTERM LICENSING AGREEMENT, OR SUCH OTHER */
/* AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO. */
/* */
/* */
/* You can contact Bit Bucket Software Co. at any one of the following */
/* addresses: */
/* */
/* Bit Bucket Software Co. FidoNet 1:104/501, 1:343/491 */
/* P.O. Box 460398 AlterNet 7:42/1491 */
/* Aurora, CO 80046 BBS-Net 86:2030/1 */
/* Internet f491.n343.z1.fidonet.org */
/* */
/* Please feel free to contact us at any time to share your comments about */
/* our software and/or licensing policies. */
/* */
/*--------------------------------------------------------------------------*/
/* Include this file before any other includes or defines! */
#include "includes.h"
#ifdef NEED_MKTEMP
char *
mktemp (char *template)
{
static char save[8] = "Z";
char *p;
int i;
p = save;
if (*p == 'Z')
sprintf (p, "%06d", TaskNumber);
while (*p)
{
if (isdigit (*p))
{
*p = 'a';
break;
}
if (*p++ < 'z')
{
break;
}
}
if ((*p == '\0') || ((i = strlen (template)) < 6))
return (NULL);
strcpy (&template[i - 6], save);
return (template);
}
#endif
#ifdef NEED_DOSREAD
#ifdef _WIN32
int
_dos_read (int fd, void far * buf, unsigned nbytes, unsigned int *bytes_read)
{
*bytes_read = read (fd, buf, nbytes);
return (*bytes_read == nbytes) ? 0 : -1;
}
int
_dos_write (int fd, void far * buf, unsigned nbytes, unsigned int *bytes_read)
{
*bytes_read = write (fd, buf, nbytes);
return (*bytes_read == nbytes) ? 0 : -1;
}
#endif
#ifdef DOS16
int
_dos_read (int fd, void far * buf, unsigned nbytes, unsigned int *bytes_read)
{
union REGS regs;
struct SREGS sregs;
regs.h.ah = 0x3f; /* read file */
regs.x.bx = fd;
regs.x.cx = nbytes;
regs.x.dx = FP_OFF (buf);
sregs.ds = FP_SEG (buf);
*bytes_read = intdosx (®s, ®s, &sregs);
return regs.x.cflag ? -1 : 0;
}
int
_dos_write (int fd, void far * buf, unsigned nbytes, unsigned int *bytes_read)
{
union REGS regs;
struct SREGS sregs;
regs.h.ah = 0x40; /* write file */
regs.x.bx = fd;
regs.x.cx = nbytes;
regs.x.dx = FP_OFF (buf);
sregs.ds = FP_SEG (buf);
*bytes_read = intdosx (®s, ®s, &sregs);
return regs.x.cflag ? -1 : 0;
}
#endif
#endif
/* For Borland C++ 2.0, change __TURBOC_OLD__ to __TURBOC__ */
#ifdef __TURBOC_OLD__
/*
* utime function for Turbo / Borland C.
*
* We should make this more generic in case some other DOS
* compiler comes up lacking, but for now the only one we
* have that needs it happens to be Borland.
*
*/
int cdecl
utime (char *name, struct utimbuf *times)
{
int handle;
struct date d;
struct time t;
struct ftime ft;
unixtodos (times->modtime, &d, &t);
ft.ft_tsec = t.ti_sec / 2;
ft.ft_min = t.ti_min;
ft.ft_hour = t.ti_hour;
ft.ft_day = d.da_day;
ft.ft_month = d.da_mon;
ft.ft_year = d.da_year - 1980;
if ((handle = open (name, O_RDONLY)) == -1)
return -1;
setftime (handle, &ft);
close (handle);
return 0;
}
#endif
int
dexists (char *filename)
{
struct stat stbuf;
return (stat (filename, &stbuf) != -1) ? 1 : 0;
}
int
got_error (char *string1, char *string2)
{
if (errno == 0x18)
errno = 0;
if (errno != 0)
{
status_line ("%s %d, %s %s %s", MSG_TXT (M_ERROR), errno, MSG_TXT (M_CANT), string1, string2);
errno = 0;
return (1);
}
return (0);
}
/* Z F R E E -- Return total number of free bytes on drive specified */
#ifdef DOS16
long
zfree (char *drive)
{
union REGS r;
unsigned char driveno;
long stat;
if (drive[0] != '\0' && drive[1] == ':')
{
driveno = (unsigned char) (islower (*drive) ? toupper (*drive) : *drive);
driveno = (unsigned char) (driveno - 'A' + 1);
}
else
driveno = 0; /* Default drive */
r.x.ax = 0x3600; /* get free space */
r.h.dl = driveno; /* on this drive */
(void) int86 (0x21, &r, &r);/* go do it */
if (r.x.ax == 0xffff) /* error return?? */
return (0);
stat = (long) r.x.bx /* bx = clusters avail */
* (long) r.x.ax /* ax = sectors/clust */
* (long) r.x.cx; /* cx = bytes/sector */
return (stat);
}
#endif /* DOS16 */
#ifdef OS_2
long
zfree (char *path)
{
int drive;
FSALLOCATE dt;
if (*path != '\0' && path[1] == ':')
drive = tolower (*path) - 'a' + 1;
else
drive = 0;
DosQFSInfo ((USHORT) drive, 1, (unsigned char far *) &dt, sizeof (FSALLOCATE));
return (dt.cSectorUnit * dt.cUnitAvail * dt.cbSector);
}
#endif
#ifdef _WIN32
long
zfree (char *drive)
{
unsigned driveno;
struct _diskfree_t diskinfo;
long stat;
if (drive[0] != '\0' && drive[1] == ':')
{
driveno = (unsigned) (islower (*drive) ? toupper (*drive) : *drive);
driveno = (unsigned) (driveno - 'A' + 1);
}
else
driveno = 0; /* Default drive */
if (_getdiskfree (driveno, &diskinfo) != 0)
return 0;
stat = diskinfo.avail_clusters
* diskinfo.sectors_per_cluster
* diskinfo.bytes_per_sector;
return (stat);
}
#endif /* _WIN32 */
static int share_flags[] =
{
#ifdef SH_COMPAT
SH_COMPAT,
#else
0,
#endif
SH_DENYNO,
SH_DENYRD,
SH_DENYRW,
SH_DENYWR
};
int
share_open (char *filename, int oflag, int shflag)
{
#ifdef DOS16
if ((no_sharing == 0) && (_osmajor >= 3))
#else
if (no_sharing == 0)
#endif /* DOS16 */
return (sopen (filename, oflag, share_flags[shflag]));
else
return (open (filename, oflag));
}
FILE *
share_fopen (char *filename, char *mode, int shflag)
{
#ifdef MUST_FDOPEN
int fd;
int open_mode;
char c, *p;
int sflag = S_IREAD | S_IWRITE;
FILE *stream;
/*
* Microsoft made this easy for us. They gave us a stream-open
* function that supports file sharing. Borland was not so kind.
* So -- what we do here is open the file using the only sharing
* API they provide -- that gives us a file handle -- then we
* use fdopen to get a file stream out of it. Sheesh!
*
* Of course, Microsoft 5.1 provides about the same level of
* support as Borland -- almost. They explicitly warn you not
* to do this neat thing I did for Borland. So I get no sharing
* support for fopen() under 5.1. Double sheesh!
*/
if ((no_sharing == 0) && (_osmajor >= 3))
{
/* Figure out the translation from fopen-mode to
open-mode... */
p = mode;
c = *p++;
if (c == 'w')
open_mode = O_CREAT | O_RDWR;
else if (c == 'r')
open_mode = O_RDONLY;
else if (c == 'a')
open_mode = O_CREAT | O_RDWR | O_APPEND;
else
return (FILE *) NULL;
while (*p)
{
c = *p++;
if (c == 't')
open_mode = (open_mode & ~O_BINARY) | O_TEXT;
if (c == 'b')
open_mode = (open_mode & ~O_TEXT) | O_BINARY;
if (c == '+')
{
if ((open_mode & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
{
open_mode = (open_mode & ~O_RDONLY) | O_RDWR;
}
else if (!(open_mode & O_APPEND))
open_mode |= O_TRUNC;
}
}
/* Open the file handle */
#ifdef SHARE_SOPEN
fd = sopen (filename, open_mode, share_flags[shflag], sflag);
#else
fd = open (filename, open_mode | share_flags[shflag], sflag);
#endif
if (fd == -1)
return (FILE *) NULL;
/* Got the handle, make the stream */
if ((stream = fdopen (fd, mode)) == (FILE *) NULL)
(void) close (fd);
return (stream);
}
else
#else
#ifndef CANT_FSOPEN
#ifdef DOS16
if ((no_sharing == 0) && (_osmajor >= 3))
#else
if (no_sharing == 0)
#endif /* DOS16 */
return (_fsopen (filename, mode, share_flags[shflag]));
else
#else
happy_compiler = shflag; /* Makes the compiler happy */
#endif
#endif
return (fopen (filename, mode));
}
#ifdef DOS16
int
dfind (struct FILEINFO *dta, char *name, int times)
{
union REGS r;
struct SREGS s;
char far *dtaptr = (char *) dta;
char far *nameptr = (char *) name;
s.ds = FP_SEG (dtaptr);
r.x.dx = FP_OFF (dtaptr);
r.h.ah = 0x1a;
(void) intdosx (&r, &r, &s);
r.x.bx = 0;
r.x.cx = (unsigned int) ~0x08;
s.ds = FP_SEG (nameptr);
r.x.dx = FP_OFF (nameptr);
r.x.si = 0;
r.x.di = 0;
if (times == 0)
{
r.h.ah = 0x4e;
(void) intdosx (&r, &r, &s);
dta->nill = '\0';
/* If not found or a character device (e.g. "COM1") */
if ((r.x.cflag != 0) || ((dta->attr & 0x40) != 0))
{
dta->name[0] = '\0';
return (1);
}
return (0);
}
else if (times == 1)
{
r.h.ah = 0x4f;
(void) intdosx (&r, &r, &s);
dta->nill = '\0';
/* If not found or a character device (e.g. "COM1") */
if ((r.x.cflag != 0) || ((dta->attr & 0x40) != 0))
{
dta->name[0] = '\0';
return (1);
}
return (0);
}
else
return (0);
}
#endif /* DOS16 */
#ifdef OS_2
#ifndef __32BIT__
static int dir_findfirst (char far *, int, struct FILEINFO *);
static int dir_findnext (struct FILEINFO *);
static int dir_findrelease (struct FILEINFO *);
int
dfind (struct FILEINFO *dta, char *name, int times)
{
if (times == 0)
{
return (dir_findfirst (name, 0x37, dta));
}
else if (times == 1)
{
return (dir_findnext (dta));
}
else
return (dir_findrelease (dta));
}
/*--------------------------------------------------------------------------*/
/* Static variable definitions */
/*--------------------------------------------------------------------------*/
struct FileTimeBuf
{
unsigned short c_date; /* date of file creation */
unsigned short c_time; /* time of file creation */
unsigned short a_date; /* date of last access */
unsigned short a_time; /* time of last access */
unsigned short w_date; /* date of last write */
unsigned short w_time; /* time of last write */
};
static struct FileTimeBuf TimeBuf;
struct FileInfo
{
USHORT hDir;
char rsvd[19];
char attrib;
unsigned short wr_date;
unsigned short wr_time;
long size;
char name[13];
char nill;
};
struct FileFindBuf
{
unsigned short create_date; /* date of file creation */
unsigned short create_time; /* time of file creation */
unsigned short access_date; /* date of last access */
unsigned short access_time; /* time of last access */
unsigned short wr_date; /* date of last write */
unsigned short wr_time; /* time of last write */
unsigned long size; /* file size (end of data) */
unsigned long falloc_size; /* file allocated size */
unsigned short attrib; /* attributes of the file */
unsigned char string_len; /* returned length of ascii name str. */
/* length does not include null byte */
char name[255]; /* name string */
};
static struct FileFindBuf InfoBuf;
/*--------------------------------------------------------------------------*/
/* Locally defined globals */
/*--------------------------------------------------------------------------*/
struct FileInfo *dtap;
HDIR hDirA;
USHORT cSearch;
USHORT usAttrib;
USHORT findrc;
/*--------------------------------------------------------------------------*/
/* Local constants */
/*--------------------------------------------------------------------------*/
#define FILENAMELEN 13
static int
dir_findfirst (char far * filename, int attribute, struct FILEINFO *dta)
{
cSearch = 1;
dtap = (struct FileInfo *) dta;
hDirA = dtap->hDir;
usAttrib = (USHORT) attribute;
if ((hDirA != 0xffff) && (hDirA != 0x0000))
(void) DosFindClose (hDirA);
hDirA = 0xffff;
findrc = DosFindFirst ((PSZ) filename
,&hDirA
,usAttrib
,(PFILEFINDBUF) & InfoBuf
,(USHORT)(sizeof (InfoBuf)) * cSearch
,&cSearch
,(ULONG) NULL);
if ((cSearch != 1) || (findrc && (findrc != ERROR_EAS_DIDNT_FIT)))
{
(void) DosFindClose (hDirA);
dtap->hDir = 0xffff;
errno = ENOENT;
return (1);
}
else
{
dtap->wr_date = InfoBuf.wr_date;
dtap->wr_time = InfoBuf.wr_time;
dtap->attrib = (char) InfoBuf.attrib;
dtap->size = InfoBuf.size / ((_osmajor == 10) ? 2 : 1);
strcpy (dtap->name, InfoBuf.name);
(void) strupr (dtap->name);
dtap->hDir = hDirA;
errno = 0;
return (0);
}
}
static int
dir_findnext (struct FILEINFO *dta)
{
cSearch = 1;
dtap = (struct FileInfo *) dta;
hDirA = dtap->hDir;
findrc = DosFindNext (hDirA
,(PFILEFINDBUF) & InfoBuf
,(USHORT) (sizeof (InfoBuf)) * cSearch
,&cSearch);
if ((cSearch != 1) || (findrc && (findrc != ERROR_EAS_DIDNT_FIT)))
{
(void) DosFindClose (hDirA);
dtap->hDir = 0xffff;
errno = ENOENT;
return (1);
}
else
{
dtap->wr_date = InfoBuf.wr_date;
dtap->wr_time = InfoBuf.wr_time;
dtap->attrib = (char) InfoBuf.attrib;
dtap->size = InfoBuf.size / ((_osmajor == 10) ? 2 : 1);
strcpy (dtap->name, InfoBuf.name);
(void) strupr (dtap->name);
dtap->hDir = hDirA;
errno = 0;
return (0);
}
}
static int
dir_findrelease (struct FILEINFO *dta)
{
dtap = (struct FileInfo *) dta;
hDirA = dtap->hDir;
if (hDirA != 0xffff)
{
(void) DosFindClose (hDirA);
dtap->hDir = 0xffff;
errno = ENOENT;
return (1);
}
else
return (0);
}
void
set_fileinfo (int fh, unsigned date, unsigned time)
{
if ((time / 2048) < (unsigned) (TIMEZONE / 3600L))
{
TimeBuf.a_date = TimeBuf.w_date = TimeBuf.c_date = date - 1;
TimeBuf.c_time = time + ((unsigned) (86400 - ((unsigned) (TIMEZONE / 3600L) * 2048)));
TimeBuf.a_time = TimeBuf.w_time = TimeBuf.c_time;
}
else
{
TimeBuf.a_date = TimeBuf.w_date = TimeBuf.c_date = date;
TimeBuf.c_time = time - ((unsigned) (TIMEZONE / 3600L) * 2048);
TimeBuf.a_time = TimeBuf.w_time = TimeBuf.c_time;
}
(void) DosSetFileInfo ((HFILE) fh,
(USHORT) 1,
(PBYTE) & TimeBuf,
(USHORT) 12);
}
#else /* ifndef __32BIT__ */
static int dir_findfirst (char far *, int, struct FILEINFO *);
static int dir_findnext (struct FILEINFO *);
static int dir_findrelease (struct FILEINFO *);
int
dfind (struct FILEINFO *dta, char *name, int times)
{
if (times == 0)
{
return (dir_findfirst (name, 0x37, dta));
}
else if (times == 1)
{
return (dir_findnext (dta));
}
else
return (dir_findrelease (dta));
}
/*--------------------------------------------------------------------------*/
/* Static variable definitions */
/*--------------------------------------------------------------------------*/
struct FileTimeBuf
{
unsigned short c_date; /* date of file creation */
unsigned short c_time; /* time of file creation */
unsigned short a_date; /* date of last access */
unsigned short a_time; /* time of last access */
unsigned short w_date; /* date of last write */
unsigned short w_time; /* time of last write */
};
static struct FileTimeBuf TimeBuf;
struct FileInfo
{
unsigned short hDir;
char rsvd[19];
char attrib;
unsigned short wr_date;
unsigned short wr_time;
ULONG size;
char name[13];
char nill;
};
struct FileFindBuf
{
ULONG nDir; /* pointer to next structure */
unsigned short create_date; /* date of file creation */
unsigned short create_time; /* time of file creation */
unsigned short access_date; /* date of last access */
unsigned short access_time; /* time of last access */
unsigned short wr_date; /* date of last write */
unsigned short wr_time; /* time of last write */
ULONG size; /* file size (end of data) */
ULONG falloc_size; /* file allocated size */
ULONG attrib; /* attributes of the file */
UCHAR string_len; /* returned length of ascii name str. */
/* length does not include null byte */
char name[CCHMAXPATHCOMP]; /* name string */
};
static struct FileFindBuf InfoBuf;
/*--------------------------------------------------------------------------*/
/* Locally defined globals */
/*--------------------------------------------------------------------------*/
struct FileInfo *dtap;
HDIR hDirA;
ULONG cSearch;
ULONG usAttrib;
ULONG infolevel;
APIRET findrc;
/*--------------------------------------------------------------------------*/
/* Local constants */
/*--------------------------------------------------------------------------*/
#define FILENAMELEN 13
static int
dir_findfirst (char far * filename, int attribute, struct FILEINFO *dta)
{
cSearch = 1;
dtap = (struct FileInfo *) dta;
hDirA = dtap->hDir;
usAttrib = (USHORT) attribute;
infolevel = 1;
if ((hDirA != 0xffff) && (hDirA != 0x0000) && (hDirA != 0xffffffff))
(void) DosFindClose (hDirA);
hDirA = 0xffffffff;
findrc = DosFindFirst ((PSZ) filename
,&hDirA
,usAttrib
,(PVOID) & InfoBuf
,(ULONG) (sizeof (InfoBuf) * cSearch)
,&cSearch
,infolevel);
if ((cSearch != 1) || (findrc && (findrc != ERROR_EAS_DIDNT_FIT)))
{
(void) DosFindClose (hDirA);
dtap->hDir = 0xffff;
errno = ENOENT;
return (1);
}
else
{
dtap->wr_date = InfoBuf.wr_date;
dtap->wr_time = InfoBuf.wr_time;
dtap->attrib = (char) InfoBuf.attrib;
dtap->size = InfoBuf.size / ((_osmajor == 10) ? 2 : 1);
strcpy (dtap->name, InfoBuf.name);
(void) strupr (dtap->name);
dtap->hDir = hDirA;
errno = 0;
return (0);
}
}
static int
dir_findnext (struct FILEINFO *dta)
{
cSearch = 1;
dtap = (struct FileInfo *) dta;
hDirA = dtap->hDir;
findrc = DosFindNext (hDirA
,(PVOID) & InfoBuf
,(ULONG) (sizeof (InfoBuf) * cSearch)
,&cSearch);
if ((cSearch != 1) || (findrc && (findrc != ERROR_EAS_DIDNT_FIT)))
{
(void) DosFindClose (hDirA);
dtap->hDir = 0xffff;
errno = ENOENT;
return (1);
}
else
{
dtap->wr_date = InfoBuf.wr_date;
dtap->wr_time = InfoBuf.wr_time;
dtap->attrib = (char) InfoBuf.attrib;
dtap->size = InfoBuf.size / ((_osmajor == 10) ? 2 : 1);
strcpy (dtap->name, InfoBuf.name);
(void) strupr (dtap->name);
dtap->hDir = hDirA;
errno = 0;
return (0);
}
}
static int
dir_findrelease (struct FILEINFO *dta)
{
dtap = (struct FileInfo *) dta;
hDirA = dtap->hDir;
if ((hDirA != 0xffff) && (hDirA != 0xffffffff))
{
(void) DosFindClose (hDirA);
dtap->hDir = 0xffff;
errno = ENOENT;
return (1);
}
else
return (0);
}
void
set_fileinfo (int fh, unsigned date, unsigned time)
{
if ((time / 2048) < (unsigned) (TIMEZONE / 3600L))
{
TimeBuf.a_date = TimeBuf.w_date = TimeBuf.c_date = date - 1;
TimeBuf.c_time = time + ((unsigned) (86400 - ((unsigned) (TIMEZONE / 3600L) * 2048)));
TimeBuf.a_time = TimeBuf.w_time = TimeBuf.c_time;
}
else
{
TimeBuf.a_date = TimeBuf.w_date = TimeBuf.c_date = date;
TimeBuf.c_time = time - ((unsigned) (TIMEZONE / 3600L) * 2048);
TimeBuf.a_time = TimeBuf.w_time = TimeBuf.c_time;
}
(void) DosSetFileInfo ((HFILE) fh,
(USHORT) 1,
(PBYTE) & TimeBuf,
(USHORT) 12);
}
#endif /* ifndef __32BIT__ */
#endif /* ifdef OS_2 */
#ifdef _WIN32
static int dir_findfirst (char far *, struct FILEINFO *);
static int dir_findnext (struct FILEINFO *);
static int dir_findrelease (struct FILEINFO *);
int
dfind (struct FILEINFO *dta, char *name, int times)
{
if (times == 0)
{
return (dir_findfirst (name, dta));
}
else if (times == 1)
{
return (dir_findnext (dta));
}
else
return (dir_findrelease (dta));
}
/*--------------------------------------------------------------------------*/
/* Static variable definitions */
/*--------------------------------------------------------------------------*/
struct FileInfo
{
long hDir;
int fActive;
char rsvd[13];
char attrib;
long time;
long size;
char name[13];
char nill;
};
static struct _finddata_t InfoBuf;
/*--------------------------------------------------------------------------*/
/* Local functions */
/*--------------------------------------------------------------------------*/
static void dir_move (struct FileInfo *dta);
/*--------------------------------------------------------------------------*/
/* Local constants */
/*--------------------------------------------------------------------------*/
#define FILENAMELEN 13
static int
dir_findfirst (char far * filename, struct FILEINFO *dta)
{
struct FileInfo *dtap = (struct FileInfo *) dta;
long hDirA;
if (dtap->fActive)
{
(void) dir_findrelease (dta);
}
hDirA = _findfirst (filename, &InfoBuf);
if (hDirA == -1)
{
errno = ENOENT;
return (1);
}
dir_move (dtap);
dtap->hDir = hDirA;
dtap->fActive = 1;
return (0);
}
static int
dir_findnext (struct FILEINFO *dta)
{
struct FileInfo *dtap = (struct FileInfo *) dta;
long hDirA;
int fResult;
if (!dtap->fActive)
return (1);
hDirA = dtap->hDir;
fResult = (_findnext (hDirA, &InfoBuf) != 0);
if (fResult)
{
errno = ENOENT;
(void) dir_findrelease (dta);
return (1);
}
dir_move (dtap);
return (0);
}
static void
dir_move (struct FileInfo *dtap)
{
struct tm *ptm;
long timelong;
ptm = localtime (&InfoBuf.time_write);
timelong = (long) (ptm->tm_sec / 2) +
(long) ((ptm->tm_min) << 5) +
(long) ((ptm->tm_hour) << 11) +
(long) ((ptm->tm_mday) << 16) +
(long) ((ptm->tm_mon + 1) << 21) +
(long) ((ptm->tm_year - 80) << 25);
dtap->time = timelong;
dtap->size = InfoBuf.size;
dtap->attrib = (char) InfoBuf.attrib;
strncpy (dtap->name, InfoBuf.name, FILENAMELEN);
(void) strupr (dtap->name);
dtap->nill = 0;
errno = 0;
}
static int
dir_findrelease (struct FILEINFO *dta)
{
struct FileInfo *dtap = (struct FileInfo *) dta;
long hDirA;
if (!dtap->fActive)
return (1);
hDirA = dtap->hDir;
(void) _findclose (hDirA);
dtap->fActive = 0;
return (0);
}
#endif /* ifdef _WIN32 */